package com.kuangstudy.utils.ids;

import com.kuangstudy.service.redis.CacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * 需求：系统需要生成根据业务类型生成流水号，每天从1开始生成，第二天会清零继续从0开始，
 *      流水号格式为： bizCode + date + incr 如：TT-201711230000100
 */
@Component
public class SequenceUtils {

    private static final int DEFAULT_LENGTH = 6;

    @Autowired
    private CacheService cacheService;

    /**
     * 每天公司的订单数量，DEFAULT_LENGTH: 3: 百订单 / 4：千订单 / 5：万订单 / 6：十万订单 / 7：百万订单
     */
    public String getSequence(String prefix) {
        // 1： 时间前缀
        String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date());
        // 2：redis递增获取每天的递增数量
        Long num = cacheService.getIncrementNum("id:generator:order:" + currentDate);
        // 3：获取递增长度，是否小于DEFAULT_LENGTH 如果小于就前面补零。如果大于就递增即可
        String str = String.valueOf(num);
        // 4：补零操作
        int len = str.length();
        // 4-1：是否小于DEFAULT_LENGTH 如果小于就前面补零。如果大于就递增即可
        StringBuilder sb = new StringBuilder();
        // 增加前缀 - 区分业务
        sb.append(prefix);
        // 5：添加时间
        sb.append(currentDate);
        if (len >= DEFAULT_LENGTH) {
            sb.append(str);
            return sb.toString();
        }
        int rest = DEFAULT_LENGTH - len;
        for (int i = 0; i < rest; i++) {
            sb.append('0');
        }
        sb.append(str);
        // 6： 时间+补零操作返回订单流水号
        return sb.toString();
    }
}